// Symbol 数据类型

// const s = Symbol()
// console.log(s)
// console.log(typeof s)//symbol
// 通过typeof 打印出来symbol，表示他确实是一种全新的数据类型。

// console.log(
//     Symbol() === Symbol()
// )
//Symbol 类型最大的特点就是独一无二的，通过他创建的类型永远都不会重复

// console.log(Symbol("foo"))
// console.log(Symbol("bar"))
// console.log(Symbol("baz"))

// Symbol 可以传入一个字符串，作为这个值得描述文本，对于多次使用Symbol的情况，便于我们区分到底是那个对应的Symbol

//从ES2015开始，对象就可以使用Symbol类型的值作为属性名，现在对象的属性名可以是两种类型，一种是字符串，一种是Symbol

// const obj = {}
// obj[Symbol()] = 123
// obj[Symbol()] = 456
// console.log(obj)
//因为Symbol的值都是独一无二的，所以就不用担心可能会产生冲突的问题。

//使用计算属性名的方式，在对象字面量当中去使用Symbol作为对象的属性名
// const obj = {
//     [Symbol()] :123
// }
// console.log(obj)

//Symbol除了可以避免对象属性名重复产生的问题，我们还可以借助Symbol这种类型特点，去模拟对象的私有成员。
//a.js==============================
const name = Symbol()
const person = {
    [name]:123,
    say(){
        console.log(this[name])
    }
}
//b.js==============================
// console.log(person[name])//因为我们没有办法在创建一个完全相同的Symbol，所以我们就不能去访问到这个成员，只能去调用这个成员当中普通名称的成员
person.say()
//Symbol最主要的的作用就是为对象添加独一无二的属性名
